(function($) {
    $.fn.paginate = function(options) {
        var opts = $.extend({}, $.fn.paginate.defaults, options);
        return this.each(function() {
            $this = $(this);
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            var selectedpage = o.start;
            $.fn.draw(o,$this,selectedpage);
        });
    };
    var outsidewidth_tmp = 0;
    var insidewidth 	 = 0;
    var bName = navigator.appName;
    var bVer = navigator.appVersion;
    if(bVer.indexOf('MSIE 7.0') > 0)
        var ver = "ie7";
    $.fn.paginate.defaults = {
        count                   : 5,
        start                   : 12,
        display                 : 5,
        border                  : true,
        border_color		: '#fff',
        text_color  		: '#999',
        background_color    	: '#fff',
        border_hover_color	: '#999',
        text_hover_color  	: '#000',
        background_hover_color	: '#eee',
        rotate      		: true,
        images			: false,
        mouse			: 'press',
        onChange		: function(){
            return false;
        }
    };
    $.fn.draw = function(o,obj,selectedpage){
        if(o.display > o.count)
            o.display = o.count;
        $this.empty();
        if(o.images){
            var spreviousclass 	= 'jPag-sprevious-img';
            var previousclass 	= 'jPag-previous-img';
            var snextclass 	= 'jPag-snext-img';
            var nextclass 	= 'jPag-next-img';
        }
        else{
            var spreviousclass 	= 'jPag-sprevious';
            var previousclass 	= 'jPag-previous';
            var snextclass 	= 'jPag-snext';
            var nextclass 	= 'jPag-next';
        }
        var _first		= $(document.createElement('a')).addClass('jPag-first').html('Primeira');
		
        if(o.rotate){
            if(o.images) var _rotleft = $(document.createElement('span')).addClass(spreviousclass);
            else var _rotleft = $(document.createElement('span')).addClass(spreviousclass).html('&laquo;');
        }
		
        var _divwrapleft = $(document.createElement('div')).addClass('jPag-control-back');
        _divwrapleft.append(_first).append(_rotleft);

        if(ver == 'ie7'){
            var _ulwrapdiv	= $(document.createElement('div')).css({
                'overflow' : 'hidden',
                'margin-left' : '15px'
            });
        } else {
            var _ulwrapdiv	= $(document.createElement('div')).css('overflow', 'hidden');
        }
        var _ul		= $(document.createElement('ul')).addClass('jPag-pages')
        var c = (o.display - 1) / 2;
        var first = selectedpage - c;
        var selobj;
        for(var i = 0; i < o.count; i++){
            var val = i+1;
            if(val == selectedpage){
                var _obj = $(document.createElement('li')).html('<span class="jPag-current">'+val+'</span>');
                selobj = _obj;
                _ul.append(_obj);
            }
            else{
                var _obj = $(document.createElement('li')).html('<a>'+ val +'</a>');
                _ul.append(_obj);
            }
        }
        _ulwrapdiv.append(_ul);
		
        if(o.rotate){
            if(o.images) var _rotright	= $(document.createElement('span')).addClass(snextclass);
            else var _rotright	= $(document.createElement('span')).addClass(snextclass).html('&raquo;');
        }
		
        var _last		= $(document.createElement('a')).addClass('jPag-last').html('Última');
        var _divwrapright	= $(document.createElement('div')).addClass('jPag-control-front');
        _divwrapright.append(_rotright).append(_last);
		
        //append all:
        $this.addClass('jPaginate').append(_divwrapleft).append(_ulwrapdiv).append(_divwrapright);
			
        if(!o.border){
            if(o.background_color == 'none')
                var a_css = {
                    'color':o.text_color
                };
            else
                var a_css = {
                    'color':o.text_color,
                    'background-color':o.background_color
                };
            if(o.background_hover_color == 'none')	var hover_css 	= {
                'color':o.text_hover_color
            };
            else var hover_css = {
                'color':o.text_hover_color,
                'background-color':o.background_hover_color
            };
        }
        else{
            if(o.background_color == 'none') var a_css = {
                'color':o.text_color,
                'border':'1px solid '+o.border_color
            };
            else var a_css = {
                'color':o.text_color,
                'background-color':o.background_color,
                'border':'1px solid '+o.border_color
            };
            if(o.background_hover_color == 'none')	var hover_css 	= {
                'color':o.text_hover_color,
                'border':'1px solid '+o.border_hover_color
            };
            else var hover_css 										= {
                'color':o.text_hover_color,
                'background-color':o.background_hover_color,
                'border':'1px solid '+o.border_hover_color
            };
        }
		
        $.fn.applystyle(o,$this,a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright);
        //calculate width of the ones displayed:
        var outsidewidth = outsidewidth_tmp - _first.parent().width() -3;
        if(ver == 'ie7'){
            _ulwrapdiv.css('width',outsidewidth+88+'px');
            _divwrapright.css('left',outsidewidth_tmp+6+88+'px');
        }
        else{
            _ulwrapdiv.css('width',outsidewidth+'px');
            _divwrapright.css('left',outsidewidth_tmp+6+'px');
        }
		
        if(o.rotate){
            _rotright.hover(
                function() {
                    thumbs_scroll_interval = setInterval(
                        function() {
                            var left = _ulwrapdiv.scrollLeft() + 1;
                            _ulwrapdiv.scrollLeft(left);
                        },
                        20
                        );
                },
                function() {
                    clearInterval(thumbs_scroll_interval);
                }
                );
            _rotleft.hover(
                function() {
                    thumbs_scroll_interval = setInterval(
                        function() {
                            var left = _ulwrapdiv.scrollLeft() - 1;
                            _ulwrapdiv.scrollLeft(left);
                        },
                        20
                        );
                },
                function() {
                    clearInterval(thumbs_scroll_interval);
                }
                );
            if(o.mouse == 'press'){
                _rotright.mousedown(
                    function() {
                        thumbs_mouse_interval = setInterval(
                            function() {
                                var left = _ulwrapdiv.scrollLeft() + 5;
                                _ulwrapdiv.scrollLeft(left);
                            },
                            20
                            );
                    }
                    ).mouseup(
                    function() {
                        clearInterval(thumbs_mouse_interval);
                    }
                    );
                _rotleft.mousedown(
                    function() {
                        thumbs_mouse_interval = setInterval(
                            function() {
                                var left = _ulwrapdiv.scrollLeft() - 5;
                                _ulwrapdiv.scrollLeft(left);
                            },
                            20
                            );
                    }
                    ).mouseup(
                    function() {
                        clearInterval(thumbs_mouse_interval);
                    }
                    );
            }
            else{
                _rotleft.click(function(e){
                    var width = outsidewidth - 10;
                    var left = _ulwrapdiv.scrollLeft() - width;
                    _ulwrapdiv.animate({
                        scrollLeft: left +'px'
                    });
                });
				
                _rotright.click(function(e){
                    var width = outsidewidth - 10;
                    var left = _ulwrapdiv.scrollLeft() + width;
                    _ulwrapdiv.animate({
                        scrollLeft: left +'px'
                    });
                });
            }
        }
		
        //first and last:
        _first.click(function(e){
            _ulwrapdiv.animate({
                scrollLeft: '0px'
            });
            _ulwrapdiv.find('li').eq(0).click();
        });
        _last.click(function(e){
            _ulwrapdiv.animate({
                scrollLeft: insidewidth +'px'
            });
            _ulwrapdiv.find('li').eq(o.count - 1).click();
        });
		
        //click a page
        _ulwrapdiv.find('li').click(function(e){
            selobj.html('<a>'+selobj.find('.jPag-current').html()+'</a>');
            var currval = $(this).find('a').html();
            $(this).html('<span class="jPag-current">'+currval+'</span>');
            selobj = $(this);
            $.fn.applystyle(o,$(this).parent().parent().parent(),a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright);
            var left = (this.offsetLeft) / 2;
            var left2 = _ulwrapdiv.scrollLeft() + left;
            var tmp = left - (outsidewidth / 2);
            if(ver == 'ie7')
                _ulwrapdiv.animate({
                    scrollLeft: left + tmp - _first.parent().width() + 52 + 'px'
                });
            else
                _ulwrapdiv.animate({
                    scrollLeft: left + tmp - _first.parent().width() + 'px'
                });
            o.onChange(currval);
        });
		
        var last = _ulwrapdiv.find('li').eq(o.start-1);
        last.attr('id','tmp');
        var left = document.getElementById('tmp').offsetLeft / 2;
        last.removeAttr('id');
        var tmp = left - (outsidewidth / 2);
        if(ver == 'ie7') _ulwrapdiv.animate({
            scrollLeft: left + tmp - _first.parent().width() + 52 + 'px'
        });
        else _ulwrapdiv.animate({
            scrollLeft: left + tmp - _first.parent().width() + 'px'
        });
    }
	
    $.fn.applystyle = function(o,obj,a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright){
        obj.find('a').css(a_css);
        obj.find('span.jPag-current').css(hover_css);
        obj.find('a').hover(
            function(){
                $(this).css(hover_css);
            },
            function(){
                $(this).css(a_css);
            }
            );
        obj.css('padding-left',_first.parent().width() + 5 +'px');
        insidewidth = 0;
					
        obj.find('li').each(function(i,n){
            if(i == (o.display-1)){
                outsidewidth_tmp = this.offsetLeft + this.offsetWidth ;
            }
            insidewidth += this.offsetWidth;
        })
        _ul.css('width',insidewidth+1+'px');
    }
})(jQuery);